#include <iostream>
#include <vector>
#include <omp.h>  // OpenMP头文件

// linear示例函数（文档3.9节示例）
void linear_example(int n, float *a, float *b) {
    int i, j = 0;  // j被声明为linear变量
    
    /* linear子句说明：
     * linear(j:1)：每个迭代j的初始值 = 进入迭代前的值 + 1*迭代号
     * 保证j在循环中的线性递增行为 */
    #pragma omp parallel for linear(j:1)
    for (i = 0; i < n; ++i) {
        // 数组a初始化：a[i] = 2*i
        a[i] = i * 2.0f;
        
        // j在每次迭代中线性递增1（等价于j = i + 初始值）
        j += 1;  
        
        // 将递增后的j值存入b数组
        b[i] = j;
    }
}

int main() {
    const int n = 100;
    float a[n], b[n];  // 声明双精度数组

    // 执行linear示例函数
    linear_example(n, a, b);

    /* 验证结果：
     * a[99] = 99*2 = 198
     * j在每个迭代递增1，最终b[99]=100 */
    std::cout << "a[99] = " << a[99]  // 预期输出198
              << "\nb[99] = " << b[99] // 预期输出100
              << std::endl;
    return 0;
}

// g++ -fopenmp linear_clause.cpp -o linear_demo
// ./linear_demo # 展示线性变量的正确递增